#ifndef PUNTERO_H
#define PUNTERO_H

#include <iostream>
using namespace std;

#include "MemoryShare.h"

template <class T>
class Puntero : private MemoryShare
{
	friend ostream& operator<< <>(ostream& out, const Puntero<T>& p);

public:
	Puntero(T* ptr = NULL);
	Puntero(const Puntero<T>& p);
	Puntero(T* ptr, const MemoryShare& m);
	virtual ~Puntero();

	T* operator->() const;
	Puntero<T>& operator=(const Puntero<T>&);

	bool operator==(const Puntero<T>& p) const;
	bool operator!=(const Puntero<T>& p) const;
	bool operator<(const Puntero<T>& p) const;
	bool operator>(const Puntero<T>& p) const;
	bool operator<=(const Puntero<T>& p) const;
	bool operator>=(const Puntero<T>& p) const;

	template<class U>
	Puntero<U> Cast() const;

private:
	T* m_Ptr;

	class PunteroColector : public MemoryColector
	{
	public:
		PunteroColector(T* ptr);

	private:
		T* m_Ptr;
		void LiberarMemoria();
	};
};

#include "Puntero.cpp"

#endif